package org.example.study4;
// 展示了 静态变量与实例锁的不匹配导致的线程安全问题。
// 尽管 increase() 方法使用 synchronized 修饰，但由于锁对象是实例（this），而共享变量 count 是静态变量（类级别），
// 最终多个线程仍能并发修改 count，导致结果小于预期值（10 万）。


// 执行不同对象的synchronized方法， 修改全局变量
public class Demo_404 {
    public static void main(String[] args) throws InterruptedException {
        // 初始化两个不同的 Counter404 实例
        Counter404 counter = new Counter404();
        Counter404 counter1 = new Counter404();

        // 创建两个线程，分别操作不同的实例
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter.increase(); // 线程1调用 counter 的 increase()
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter1.increase(); // 线程2调用 counter1 的 increase()
            }
        });

        // 启动线程
        t1.start(); // 线程1操作 counter
        t2.start(); // 线程2操作 counter1

        // 等待线程结束
        t1.join();
        t2.join();

        // 输出结果（counter.count 应为静态变量，但输出可能混乱）
        System.out.println("count = " + counter.count);
    }
}


class Counter404 {
    public static int count = 0; // 静态变量，所有实例共享

    /**
     * 同步实例方法（锁对象为 this）
     */
    public synchronized void increase() {
        count++; // 操作静态变量，但锁是实例级别的
    }
}

// 运行：count = 73214  // 实际值随机，因线程调度而异

/*静态变量 count：属于类级别，所有 Counter404 实例共享。
synchronized 实例方法：锁对象是当前实例（this）。
线程1调用 counter.increase()，锁定 counter 实例。锁对象为counter
线程2调用 counter1.increase()，锁定 counter1 实例。锁对象为counter1.两个对象不是同一个实例，也意味着两个线程的锁对象不同。不存在锁竞争。
两个线程使用不同的锁对象，可以同时执行 count++，导致数据竞争。存在线程安全问题*/

/*总结：
核心问题：静态变量的同步必须使用类级别锁（如 synchronized(Counter404.class) 或静态同步方法），而非实例锁。
体现知识点：锁对象的选择必须与共享变量的作用域严格匹配。
实际意义：在多线程编程中，若共享资源是静态变量，必须使用类级别锁；若共享资源是实例变量，则使用实例锁*/